package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.entity.Orders;
import com.sky.entity.StatisticsResult;
import com.sky.vo.OrderStatisticsVO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author liudo
 * @version 1.0
 * @project sky-take-out
 * @date 2024/2/25 09:23:59
 */
@Mapper
public interface OrderMapper {
    /**
     * 插入
     *
     * @param orders 订单
     */
    void insert(Orders orders);

    /**
     * 选择一个
     *
     * @param ordersQuery 订单查询
     * @return {@link Orders}
     */
    Orders selectOne(Orders ordersQuery);

    /**
     * 按id更新
     *
     * @param orders 订单
     */
    void updateById(Orders orders);

    /**
     * 按时间前状态更新
     *
     * @param status    status
     * @param orderTime orderTime
     */
    void updateByStatusBeforeTime(Integer status, LocalDateTime orderTime);

    /**
     * 按状态更新状态
     *
     * @param target 目标
     * @param from   从…起
     */
    void updateStatusByStatus(Integer target, Integer from);



    /**
     * 选择页面
     *
     * @param orders 订单
     * @return {@link Page}<{@link Orders}>
     */
    Page<Orders> selectPage(Orders orders);


    /**
     * 选择一个通过id
     *
     * @param id id
     * @return {@link Orders}
     */
    Orders selectById(Long id);


    /**
     * 选择统计
     *
     * @return {@link List}<{@link Map}<{@link Integer}, {@link Integer}>>
     */
    OrderStatisticsVO selectStatistics();

    /**
     * 选择营业额统计
     *
     * @param localDates 当地日期
     * @return {@link List}<{@link Map}<{@link String}, {@link Object}>>
     */
    List<Map<String, Object>> selectTurnoverStatistics(List<LocalDate> localDates);

    /**
     * 选择订单统计总数
     *
     * @param begin 开始
     * @param end   终止
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    Map<String, Object> selectOrdersStatisticsTotal(LocalDate begin, LocalDate end);

    /**
     * 选择订单统计信息
     *
     * @param localDates 当地日期
     * @return {@link List}<{@link Map}<{@link String}, {@link Object}>>
     */
    List<Map<String, Object>> selectOrdersStatistics(ArrayList<LocalDate> localDates);

    /**
     * 选择前10名
     *
     * @param begin 开始
     * @param end   终止
     * @return {@link List}<{@link Map}<{@link String}, {@link Object}>>
     */
    List<Map<String, Object>> selectTop10(LocalDate begin, LocalDate end);

    StatisticsResult selectStatisticsResult(LocalDate begin, LocalDate end);

    List<StatisticsResult> selectStatisticsResults(ArrayList<LocalDate> localDates);
}
